package bombita.modelo.Movimientos;

import java.util.List;

import org.jdom2.DataConversionException;
import org.jdom2.Element;

import bombita.modelo.CosaDelMapa;
import bombita.modelo.Direccion;
import bombita.modelo.Interfaces.Sincronico;
import bombita.modelo.Mapa.PosicionFueraDeMapaException;

public abstract class Movimiento implements Sincronico
{
	protected float tiempoRetardo;
	protected float tiempoEspera;
	
	protected abstract boolean admitidoPor(List<CosaDelMapa> entidades);
	
	public boolean mover(Direccion dir, CosaDelMapa entidad)
	{
		if (this.tiempoEspera > 0)
			return false;
		if (!entidad.getPosicion().esPosicionValida(dir.aVector())) 
			return false;
		try {
			if (!this.admitidoPor(entidad.getPosicion().cosasEnPosicion(dir.aVector())))
				return false;
			entidad.getPosicion().reposicionar(dir.aVector());
			this.tiempoEspera = this.tiempoRetardo;
		} catch (PosicionFueraDeMapaException e) {}
		return true;
	}

	@Override
	public void recibirPulsoReloj(float tiempo) {
		if (tiempoEspera > 0) {
			tiempoEspera -= tiempo;
		}
	}

	public Element serializar()
	{
		Element nodo = new Element(this.getClass().getCanonicalName().substring("bombita.modelo.".length()));
		nodo.setAttribute("espera", Float.toString(tiempoEspera));
		return nodo;
	}
	
	public void aplicarSerializado(Element nodo) throws DataConversionException
	{
		tiempoEspera = nodo.getAttribute("espera").getFloatValue();
	}
}
